package com.woniu.sharepark.leasesystem.lessor.util;

import com.woniu.sharepark.common.JsonResult;
import com.woniu.sharepark.common.pojo.UserInfo;
import com.woniu.sharepark.leasesystem.lessor.dto.CarParkDTO;
import com.woniu.sharepark.leasesystem.lessor.pojo.CarPark;

import java.util.HashSet;
import java.util.Set;

/**
 * @ClassName: CarParkUtil
 * @Description: 此为CarPark工具类，封装了与CarPark有关的工具方法
 * @Author: Zongjie.Li
 * @Date: 2019/6/5
 * @Version: 1.0
 **/
public class CarParkUtil {
    /**
     * 此方法为判断CarParkDTO输入是否合法，如果必要数据为空是，则会返回相应的提示
     * 如果输入合法，则会返回null值
     *
     * @param carParkDTO Param Description
     * @return com.woniu.sharepark.common.JsonResult
     * @Author Zongjie.Li
     * @Date 2019/6/5
     * @version 1.1
     * @Date 2019/6/11
     * 新增车位图片判断
     *
     * @version 1.2
     * @date 2019.6.19
     * @author Zongjie.Li
     *
     * 新增时间判断
     */
    public static JsonResult dtoVerify(CarParkDTO carParkDTO) {
        if (carParkDTO.getCommunityID() == null) {
            return JsonResult.error("请选择您车位所在的小区");
        }
        if (carParkDTO.getAddress() == null || "".equals(carParkDTO.getAddress())) {
            return JsonResult.error("请输入您车位的详细地址");
        }
        if (carParkDTO.getNumberStart() == null) {
            return JsonResult.error("请输入您的车位号");
        }
        if (carParkDTO.getPrice() == null) {
            return JsonResult.error("请输入您的车位的价格");
        }
        Integer timeStart = carParkDTO.getTimeStart();
        if (timeStart == null) {
            return JsonResult.error("请输入您期望开始的出租时间");
        }
        Integer timeEnd = carParkDTO.getTimeEnd();
        if (timeEnd == null) {
            return JsonResult.error("请输入您期望结束的出租时间");
        }
        if (timeStart < 0 || timeEnd > 24) {
            return JsonResult.error("请输入0-24中的合法时间");
        }
        if (timeStart >= timeEnd){
            return JsonResult.error("很抱歉，开始时间不能大于结束时间");
        }
        String fileName = carParkDTO.getPropertyInfo().getOriginalFilename();
        if (fileName == null || "".equals(fileName)) {
            return JsonResult.error("请上传您的产权信息");
        }
        String picName = carParkDTO.getCarParkPic().getOriginalFilename();
        if (picName == null || "".equals(picName)) {
            return JsonResult.error("请上传您的车位图片");
        }
        if (carParkDTO.getNumberEnd() != null && (carParkDTO.getNumberEnd() - carParkDTO.getNumberStart()) > 11) {
            return JsonResult.error("很抱歉，本系统最大只能一次插入12条数据");
        }
        return null;
    }

    /**
     * 此方法用于将前端传过来的DTO对象转化为执行SQL时对应的语句中Value后面的String类型的值
     *
     * @param carParkDTO DTO对象
     * @param userID     登录时的UserID
     * @param fileName   上传文件后保存在本地的ID
     * @param picName
     * @return java.lang.String
     * @Author Zongjie.Li
     * @Date 2019/6/5
     */
    public static String toListValues(CarParkDTO carParkDTO, Integer userID, String fileName, String picName) {
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append(toOneValue(carParkDTO, userID, fileName, picName));
        Integer end = carParkDTO.getNumberEnd();
        if (end != null) {
            Integer start = carParkDTO.getNumberStart();
            for (Integer i = end; i > start; i--) {
                carParkDTO.setNumberStart(i);
                stringBuffer.append("," + toOneValue(carParkDTO, userID, fileName, picName));
            }
        }
        return stringBuffer.toString();
    }

    /**
     * 此方法用于将一个CarParkDTO对象转化为对应的SQL添加时Value后面对应String类型的值
     *
     * @param carParkDTO 需要添加的对象
     * @param userID     车位对应的User的ID
     * @param fileName   上传图片时保存在本地的名字
     * @return java.lang.String
     * @Author Zongjie.Li
     * @Date 2019/6/5
     * @Version 1.1
     * @Author Zongjie.Li
     * @Date 2019/6/5
     * 更改拼接字符串的方式为StringBuffer拼接，有效提高性能
     */
    private static String toOneValue(CarParkDTO carParkDTO, Integer userID, String fileName, String picName) {
        //添加顺序为UserID 小区ID 地址 车位号 价格 起租时间 终租时间 产权信息图片ID 车位信息图片
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append("(");
        stringBuffer.append(userID);
        stringBuffer.append(",");
        stringBuffer.append(carParkDTO.getCommunityID());
        stringBuffer.append(",'");
        stringBuffer.append(carParkDTO.getAddress());
        stringBuffer.append("',");
        stringBuffer.append(carParkDTO.getNumberStart());
        stringBuffer.append(",");
        stringBuffer.append(carParkDTO.getPrice());
        stringBuffer.append(",");
        stringBuffer.append(carParkDTO.getTimeStart());
        stringBuffer.append(",");
        stringBuffer.append(carParkDTO.getTimeEnd());
        stringBuffer.append(",'");
        stringBuffer.append(fileName);
        stringBuffer.append("','");
        stringBuffer.append(picName);
        stringBuffer.append("')");
        return stringBuffer.toString();
    }

    /**
     * 此方法用于检测DTO中所包含的车位范围内在数据库中是否有重复
     *
     * @param start      车位范围开始处
     * @param end        车位范围结束处
     * @param carParkSet 数据库中存在的车库Set
     * @return java.util.Set<java.lang.Integer>
     * @Author Zongjie.Li
     * @Date 2019/6/5
     */
    public static Set<Integer> carParkRepeatVerify(Integer start, Integer end, Set<Integer> carParkSet) {
        Set<Integer> addSet = new HashSet<>();
        addSet.add(start);
        if (end != null) {
            for (Integer i = end; i > start; i--) {
                addSet.add(i);
            }
        }
        carParkSet.retainAll(addSet);
        return carParkSet;
    }

    /**
     * 此方法用于将传入的CarPark的相关信息进行打码操作
     *
     * @param carPark Param Description
     * @return com.woniu.sharepark.leasesystem.lessor.pojo.CarPark
     * @Author Zongjie.Li
     * @Date 2019/6/12
     * @Version 1.0
     */
    public static void informationHide(CarPark carPark) {
        carPark.setcNumber(null);
        UserInfo userInfo = carPark.getUserInfo();
        userInfo.setuName(stringHide(userInfo.getuName(),1,Math.max(userInfo.getuName().length()-1,2)));
        userInfo.setuSex("*");
        userInfo.setuCard(stringHide(userInfo.getuCard(),6,14));
        userInfo.setuTel(stringHide(userInfo.getuTel(),3,7));
        userInfo.setuMoney(0.0);
    }

    /**
     * 对传入的字符串进行打码
     *
     * @param s Param Description
     * @param start Param Description
     * @param end Param Description
     * @return java.lang.String
     * @Author Zongjie.Li
     * @Date 2019/6/12
     * @Version 1.0
     */
    private static String stringHide(String s, int start, int end) {
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append(s.substring(0,start));
        for(int i = start ; i < end ; i++){
            stringBuffer.append("*");
        }
        stringBuffer.append(s.substring(end,s.length()));
        return stringBuffer.toString();
    }
}
